package com.zzmcc.weixin;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import com.jfinal.kit.PropKit;
import com.jfinal.weixin.sdk.api.ApiConfig;
import com.jfinal.weixin.sdk.api.ApiResult;
import com.jfinal.weixin.sdk.api.MenuApi;
import com.jfinal.weixin.sdk.api.UserApi;
import com.jfinal.weixin.sdk.jfinal.ApiController;

import util.ChristStringUtil;

import java.util.Map;

public class WeixinApiController extends ApiController {

	private String menuStr;	// 正确获取到 access_token 时有值

	/**
	 * 如果要支持多公众账号，只需要在此返回各个公众号对应的  ApiConfig 对象即可
	 * 可以通过在请求 url 中挂参数来动态从数据库中获取 ApiConfig 属性值
	 */
	public ApiConfig getApiConfig() {
		ApiConfig ac = new ApiConfig();
		
		// 配置微信 API 相关常量
		ac.setToken(PropKit.get("token"));
		ac.setAppId(PropKit.get("appId"));
		ac.setAppSecret(PropKit.get("appSecret"));
		
		/**
		 *  是否对消息进行加密，对应于微信平台的消息加解密方式：
		 *  1：true进行加密且必须配置 encodingAesKey
		 *  2：false采用明文模式，同时也支持混合模式
		 */
		ac.setEncryptMessage(PropKit.getBoolean("encryptMessage", false));
		ac.setEncodingAesKey(PropKit.get("encodingAesKey", "setting it in config file"));
		return ac;
	}
	

	public void index() {
		render("../api/menu.html");
	}

	public void edit() {
		try {
			ApiResult apiResult = MenuApi.getMenu();
			String jsonStr=apiResult.getJson();
			@SuppressWarnings("rawtypes")
			Map<String, Object> menuMap = JSON.parseObject(jsonStr, Map.class);
			menuStr = ChristStringUtil.castString(menuMap.get("menu"));
			setAttr("apiResult",menuStr);
			render("../api/menu_input.html");
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public void update() {
		String jsonStr = getPara("menu");
		MenuApi menuApi = new MenuApi();
		ApiResult apiResult = menuApi.createMenu(jsonStr);
		if (apiResult.isSucceed())
			renderJson(toDwzJson(200,"菜单修改成功！", "", true));

		else
			renderText(apiResult.getErrorMsg());
	}

	public void delete() {

		MenuApi menuApi = new MenuApi();
		ApiResult apiResult = menuApi.deleteMenu();
		if (apiResult.isSucceed())
			renderJson(toDwzJson(200, "菜单删除成功！", "", true));

		else
			renderText(apiResult.getErrorMsg());
	}
	
	/**
	 * 获取公众号菜单
	 */
	public void getMenu() {
		ApiResult apiResult = MenuApi.getMenu();
		if (apiResult.isSucceed())
			renderText(apiResult.getJson());
		else
			renderText(apiResult.getErrorMsg());
	}
	
	/**
	 * 获取公众号关注用户
	 */
	public void getFollowers() {
		ApiResult apiResult = UserApi.getFollows();
		// TODO 用 jackson 解析结果出来
		renderText(apiResult.getJson());
	}

	public String toDwzJson(Integer statusCode,String message,String navTabId,boolean close){
		JSONObject json = new JSONObject();
		json.put("statusCode", statusCode);
		if(message!=null)
			json.put("message",message);
		if(navTabId!=null)
			json.put("navTabId", navTabId);
		if(close)
			json.put("callbackType","closeCurrent");
		return  json.toJSONString();
	}
}

